# 需求：使用‘注册A.html’页面，完成对城市下拉框的操作
# 1).选择‘广州’
# 2).暂停2秒，选择‘上海’
# 3).暂停2秒，选择‘北京’
# 核心：使用selenium内置的Select类操作原生下拉框（<select>+<option>标签），三种选择方式全覆盖

# 从time模块导入sleep函数，用于操作间隔暂停（观察效果+确保操作稳定性）
from time import sleep
# 从selenium库导入webdriver模块，用于创建浏览器驱动、控制浏览器
from selenium import webdriver
# 从selenium导入Keys类（此处未实际使用，保留原导入，可后续扩展）
from selenium.webdriver.common.keys import Keys
# 导入Select类：selenium专门用于操作原生下拉框（<select>标签）的工具类，简化下拉框操作
from selenium.webdriver.support.select import Select
# 导入WebDriverWait类（此处未实际使用，保留原导入，可后续扩展显式等待）
from selenium.webdriver.support.wait import WebDriverWait
# 导入By类：适配新版selenium，替代已弃用的find_element_by_*方法
from selenium.webdriver.common.by import By

# 1. 初始化并打开Chrome浏览器
# executable_path：指定ChromeDriver驱动的本地绝对路径（适配selenium3及以下版本）
# 驱动作用：建立Python代码与Chrome浏览器的通信桥梁，实现对浏览器的控制
driver = webdriver.Chrome(executable_path='D:/chrome_driver/chromedriver.exe')
# 注释：selenium4及以上版本推荐写法（无需手动指定驱动路径）
# 需提前安装 webdriver-manager 库（pip install webdriver-manager），自动匹配浏览器版本下载驱动
# driver = webdriver.Chrome() # 创建Chrome浏览器对象，后续通过该对象执行所有操作

# 放大浏览器窗口
# maximize_window()：将窗口调整为屏幕最大尺寸，避免下拉框因窗口过小被隐藏，提高操作稳定性
driver.maximize_window()

# 2. 访问目标页面（注册A页面）
# get()方法：接收完整网络URL，让浏览器加载并显示该网页
driver.get("http://121.43.169.97:8848/pageA.html")

'''
# Select类操作下拉框核心说明：
# 步骤:
# 1. 导包：from selenium.webdriver.support.select import Select（已在顶部完成）
# 2. 实例化Select类：必须传入<select>标签的元素对象（不能直接传入<option>元素）
#    匿名用法：Select(select_element).select_by_xxx()  # 单次使用，无需保存对象
#    实名用法：select = Select(select_element)  # 多次操作同一下拉框时推荐，复用对象
# 注意事项: 
# 1. Select类仅支持原生下拉框（页面标签为<select>，子元素为<option>），不支持自定义下拉框（如div/ul模拟）
# 2. 实例化时传入的element必须是<select>标签，否则会抛出UnexpectedTagNameException异常
'''

# ---------------------------------------------------# 方式1：通过下标/索引选择（注释状态，取消注释可执行）------------------------------------------------
# 核心逻辑：通过<option>标签在<select>中的索引位置选择（索引从0开始，依次递增）
'''
# 步骤1：定位下拉框的<select>标签（id为selectA，唯一性强，定位高效）
# 旧版定位方式（已弃用）：el = driver.find_element_by_css_selector("#selectA")
el = driver.find_element(By.CSS_SELECTOR, "#selectA")

# 步骤2：实例化Select类，关联当前下拉框
select = Select(el)

# 暂停2秒：等待下拉框加载完成
sleep(2)

# 1).选择‘广州’：假设广州对应的<option>索引为2（需根据页面实际顺序调整，索引从0开始）
select.select_by_index(2)

# 2).暂停2秒，选择‘上海’：假设上海对应的索引为1
sleep(2)
select.select_by_index(1)

# 3).暂停2秒，选择‘北京’：假设北京对应的索引为0
sleep(2)
select.select_by_index(0)
'''

# ---------------------------------------------------# 方式2：通过value值选择（注释状态，取消注释可执行）------------------------------------------------
# 核心逻辑：通过<option>标签的value属性值选择（value属性由页面定义，通常具有唯一性）
'''
# 步骤1：定位<select>标签元素
el = driver.find_element(By.CSS_SELECTOR, "#selectA")

# 步骤2：实例化Select类
select = Select(el)

# 暂停2秒：等待下拉框加载完成
sleep(2)

# 1).选择‘广州’：假设广州对应的<option>标签value属性为"gz"（需与页面实际value一致）
select.select_by_value("gz")

# 2).暂停2秒，选择‘上海’：上海对应的value属性为"sh"
sleep(2)
select.select_by_value("sh")

# 3).暂停2秒，选择‘北京’：北京对应的value属性为"bj"
sleep(2)
select.select_by_value("bj")
'''

# ---------------------------------------------------# 方式3：通过文本值（显示内容）选择（当前启用，推荐优先使用）------------------------------------------------
# 核心逻辑：通过<option>标签的可见文本选择（与页面上显示的城市名称完全匹配，可读性最强，维护成本低）

# 步骤1：定位下拉框的<select>标签（id为selectA，确保是<select>标签）
# 修复：替换已弃用的find_element_by_css_selector→使用find_element(By.CSS_SELECTOR, 定位器)
el = driver.find_element(By.CSS_SELECTOR, "#selectA")

# 步骤2：实例化Select类，关联当前下拉框（后续所有操作都基于该下拉框）
select = Select(el)

# 暂停2秒：等待页面下拉框完全加载，避免动态加载导致选择失败
sleep(2)

# 1).选择‘广州’：select_by_visible_text(文本)→文本需与页面显示完全一致（大小写、空格敏感）
select.select_by_visible_text("广州")

# 2).暂停2秒，选择‘上海’：传入页面显示的文本"上海"
sleep(2)
select.select_by_visible_text("上海")

# 3).暂停2秒，选择‘北京’：传入页面显示的文本"北京"
sleep(2)
select.select_by_visible_text("北京")

# （可选）延长暂停时间观察最终效果，然后关闭浏览器
sleep(3)
# 关闭浏览器并释放资源
driver.quit()